#include "reshandler.h"
#include "client.h"
#include <QMessageBox>
#include "index.h"

ResHandler::ResHandler()
{

}

void ResHandler::handleRegist(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    if(ret) {
        QMessageBox::information(&Client::getInstance(), "注册", "注册成功");//原来的this换成客户端的指针
    }
    else{
        QMessageBox::information(&Client::getInstance(), "注册", "注册失败：用户名或密码名非法");
    }
}

void ResHandler::handleLogin(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    if(ret) {
        Index::getInstance().show();
        Client::getInstance().hide();//客户端调用的，还用实例
    }
    else{
        QMessageBox::information(&Client::getInstance(), "登录", "登录失败：用户名或密码名非法");
    }
}

void ResHandler::handleFindUser(PDU *pdu)
{
    int ret;
    char caName[32] = {'\0'};
    memcpy(caName, pdu->caData, 32);//客户端接收消息
    memcpy(&ret, pdu->caData + 32, sizeof(int));//客户端接收消息
    Friend* friendPage = Index::getInstance().getFriend();//得到friend页面
    //按类型处理
    QString msg;
    if(ret == -1) {
        QMessageBox::information(friendPage, "搜索", QString("%1 不存在").arg(caName));
    }
    else if (ret == 0){
        QMessageBox::information(friendPage, "搜索", QString("%1 不在线").arg(caName));
    }
    else {
        int ret = QMessageBox::information(friendPage, "搜索", QString("%1 在线").arg(caName),"添加好友","取消");//caName是目标用户
        if(ret == 0)
        {
            QString strCurName = Client::getInstance().m_strLoginName;
            PDU* pdu = mkPDU(0);//构建PDU
            pdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_REQUEST;//传类型
            memcpy(pdu->caData,strCurName.toStdString().c_str(), 32);//当前用户名放入caData里
            memcpy(pdu->caData + 32,caName, 32);//目标用户名放入caData里
            Client::getInstance().sendPDU(pdu);//发送给服务器
        }
    }

}

void ResHandler::handleOnlineUser(PDU *pdu, QString& LoginName)
{
    QStringList userList;
    int size = pdu->uiMsgLen/32;//存消息长度
    char caTmp[32] = {'\0'};
    for(int i = 0; i < size; i++)
    {
        memcpy(caTmp, pdu->caMsg+i*32, 32);
        if(LoginName == QString(caTmp))//m_strLoginName是服务器作为引用传过来的
        {
            continue;
        }
        userList.append(QString(caTmp));//放入  转类型
    }
    Index::getInstance().getFriend()->getOnlineUser()->showOnlineUser(userList);//将userList传给OnlineUser()函数
}

void ResHandler::handleADDFriend(PDU *pdu)
{
    int ret;
    memcpy(&ret, pdu->caData, sizeof(int));//取第二个参数放到第一个参数里，占第三个参数那么大的内存
    QString msg;
    if (ret == -1)
    {
        msg = "添加错误";
    }
    else if (ret == -2)
    {
        msg = "对方已经是你的好友";
    }
    else if (ret == 0)
    {
        msg = "对方不在线";
    }
    else
    {
        return;
    }
    QMessageBox::information(Index::getInstance().getFriend(), "搜索", msg);//展示
}

void ResHandler::handleADDFriendRequest(PDU *pdu)
{
    char caCurName[32] = {'\0'};
    memcpy(caCurName, pdu->caData, 32);
    int ret = QMessageBox::question(
                Index::getInstance().getFriend(), "添加好友",
                QString("是否同意 %1 的好友请求").arg(caCurName));
    if(ret != QMessageBox::Yes)
    {
        return;//拒绝
    }
    //同意就构建pdu
    PDU* respdu = mkPDU(0);//构建
    memcpy(respdu->caData, pdu->caData,64);//复制
    respdu->uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_AGREE_REQUEST;//类型
    Client::getInstance().sendPDU(respdu);//发送
}

void ResHandler::handleADDFriendAgree()
{
    QMessageBox::information(Index::getInstance().getFriend(),"添加好友","添加好友成功");
    Index::getInstance().getFriend()->flushFriend();
}

void ResHandler::handleOnlineFriend(PDU *pdu)
{
    qDebug() << "handleOnlineFriend start";
    QStringList friendList;
    char caTmp[32];
    int size = pdu->uiMsgLen/32;//存消息长度
    for(int i = 0; i < size; i++)
    {
        memcpy(caTmp, pdu->caMsg+i*32, 32);
        friendList.append(QString(caTmp));
    }
    qDebug() <<"handleOnlineFriend friendList.size()" <<friendList.size();
    Index::getInstance().getFriend()->m_FriendList = friendList;
    Index::getInstance().getFriend()->showOnlineFriend(friendList);//将userList传给OnlineUser()函数
}

void ResHandler::handleDelFriend(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFriend(), "删除好友", "删除好友失败");
    }
    Index::getInstance().getFriend()->flushFriend();
}

void ResHandler::handleChat(PDU *pdu)
{
    Chat* c = Index::getInstance().getFriend()->getChat();
    if(c->isHidden()){
        c->show();//显示聊天窗口
    }
    char caChatName[32] = {'\0'};
    memcpy(caChatName, pdu->caData,32);
    c->m_chatName = caChatName;//更新聊天窗口的聊天名字成员变量
    c->updateShow_LE(QString("%1 : %2").arg(caChatName).arg(pdu->caMsg));//调用更新函数
}

void ResHandler::handlemkdir(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));

    if(!ret) {// 如果创建失败，弹出提示框
        QMessageBox::information(Index::getInstance().getFile(), "创建文件夹", "创建文件夹失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::handleFlushFile(PDU *pdu)//调用更新列表框的函数
{
    QList<FileInfo*> pFileInfoList;// 创建文件信息列表
    int fileNum = pdu->uiMsgLen/sizeof (FileInfo);// 计算文件数量
    for(int i = 0; i < fileNum; i++){// 遍历PDU中的文件信息，将其拷贝到文件信息列表中
        FileInfo *pFileInfo = new FileInfo;// 创建文件信息对象
        memcpy(pFileInfo, pdu->caMsg+i*sizeof (FileInfo), sizeof (FileInfo));// 将PDU中的文件信息拷贝到文件信息对象中
        pFileInfoList.append(pFileInfo);// 将文件信息对象添加到文件信息列表中
    }
    Index::getInstance().getFile()->showFileList(pFileInfoList);// 调用Index单例获取File对象，并调用showFileList方法更新文件列表
}

void ResHandler::delDir(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"delDir ret: "<< ret;
    if(!ret) {// 如果删除失败，弹出提示框
        QMessageBox::information(Index::getInstance().getFile(), "删除文件夹", "删除文件夹失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::RenameFile(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"RenameFile ret: "<< ret;
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFile(), "重命名文件", "重命名文件失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::delFile(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"delFile ret: "<< ret;
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFile(), "删除文件", "删除文件失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::MoveFile(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"MoveFile ret: "<< ret;
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFile(), "移动文件", "移动文件失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::UploadFile(PDU *pdu)
{
    int ret;
    memcpy(&ret,pdu->caData,sizeof(int));
    if(ret == 0){
        Index::getInstance().getFile()->uploadFile();
    }else{
        QMessageBox::information(Index::getInstance().getFile(),"上传文件","上传文件失败");
    }
}

void ResHandler::UploadFileData(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"MoveFile ret: "<< ret;
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFile(), "上传文件数据", "上传文件数据失败");
    }
    Index::getInstance().getFile()->flushFile();
}

void ResHandler::DownloadFile(PDU *pdu)
{
    qDebug() <<"DownloadFile start";
    int ret;
    memcpy(&ret,pdu->caData,sizeof(int));
    if(ret == 0){
        qint64 iFileSize;
        memcpy(&iFileSize, pdu->caData+32 ,sizeof(qint64));
        Index::getInstance().getFile()->downloadFile(iFileSize);
    }else{
        QMessageBox::information(Index::getInstance().getFile(),"上传文件","上传文件失败");
    }
    qDebug() <<"DownloadFile end";
}

void ResHandler::DownloadFileData(PDU *pdu)
{
    qDebug() <<"DownloadFileData start";
    Index::getInstance().getFile()->downloadFileData(pdu->caMsg,pdu->uiMsgLen);
}

void ResHandler::ShareFile()
{
    qDebug() << "ResHandler::ShareFile start";
    QMessageBox::information(Index::getInstance().getFile(),"分享文件","文件已分享");
}

void ResHandler::ShareFileRequest(PDU *pdu)
{
    QString strSharePath = QString(pdu->caMsg);
    int index = strSharePath.lastIndexOf('/');
    QString strFileName = strSharePath.right(strSharePath.size() - index - 1);
    int ret = QMessageBox::question(
                Index::getInstance().getFile()->m_pShareFile,
                "分享文件",
                QString("%1 分享文件: %2\n是否接收？").arg(pdu->caData).arg(strFileName));
    if(ret != QMessageBox::Yes){
        return;
    }
    PDU* respdu = mkPDU(pdu->uiMsgLen);
    respdu->uiMsgType = ENUM_MSG_TYPE_SHARE_FILE_AGREE_REQUEST;
    memcpy(respdu->caData, Client::getInstance().m_strLoginName.toStdString().c_str(), 32);
    memcpy(respdu->caMsg, pdu->caMsg, pdu->uiMsgLen);
    Client::getInstance().sendPDU(respdu);
}

void ResHandler::ShareFileAgree(PDU *pdu)
{
    bool ret;
    memcpy(&ret, pdu->caData, sizeof(bool));
    qDebug() <<"ShareFileAgree ret: "<< ret;
    if(!ret) {
        QMessageBox::information(Index::getInstance().getFile(), "分享文件", "分享文件失败");
    }
    Index::getInstance().getFile()->flushFile();
}
